<?php

class AdministracaoController extends Controller {

    const PACKAGE_VIEW = 'administracao';

    /**
     * @var AdministracaoService
     */
    private $administracaoService;
    /**
     * @var UsuarioService
     */
    private $usuarioService;
    /**
     * @var DepartamentoService
     */
    private $departamentoService;
    /**
     * @var SetorService
     */
    private $setorService;
    /**
     * @var FuncaoService
     */
    private $funcaoService;
    /**
     * @var FerramentaService
     */
    private $ferramentaService;
    /**
     * @var PreferenciaService
     */
    private $preferenciaService;
    /**
     * @var PagamentoService
     */
    private $pagamentoService;

    public function __construct() {
        $this->administracaoService = AdministracaoService::getInstance();
        $this->usuarioService = UsuarioService::getInstance();
        $this->departamentoService = DepartamentoService::getInstance();
        $this->setorService = SetorService::getInstance();
        $this->funcaoService = FuncaoService::getInstance();
        $this->ferramentaService = FerramentaService::getInstance();
        $this->preferenciaService = PreferenciaService::getInstance();
        $this->pagamentoService = PagamentoService::getInstance();
    }

    public function funcionarios() {
        $ArUsersList = $this->usuarioService->findAll(true);
        $this->save(SESSION_INTERFACE, 'ArUserList', $ArUsersList);
        $this->view('funcionarios', self::PACKAGE_VIEW);
    }

    public function visualizarFuncionario() {
        $IDUsuario = treatUrl('id');
        multipleEntities($IDUsuario);
        $Usuario = $this->usuarioService->findById($IDUsuario);
        $this->save(SESSION_INTERFACE, 'UserView', $Usuario);
        $this->view('visualizar_funcionario', self::PACKAGE_VIEW);
    }

    public function filter() {
        $filterType = treatUrl('type');
        $IDFilter = $_POST['filterkey'];
        multipleEntities($IDFilter);

        $ArUserList = $this->administracaoService->findUserByFilter($IDFilter, $filterType);

        $this->save(SESSION_INTERFACE, 'ArUserList', $ArUserList);

        if( $filterType == 'employee' )  {
            $this->view('usertablelist', self::PACKAGE_VIEW, true);
        } else if( $filterType == 'employee-payment' ) {
            $this->view('paymentusertablelist', self::PACKAGE_VIEW, true);
        }
    }

    public function editarFuncionario() {
        $IDUsuario = treatUrl('id');
        multipleEntities($IDUsuario);
        $Usuario = $this->administracaoService->findEmployeeById($IDUsuario);
        $ArDepartamentos = $this->departamentoService->findAll(true);
        $ArFuncoes = $this->funcaoService->findAll(true);

        $this->save(SESSION_INTERFACE, 'UsuarioEdit', $Usuario);
        $this->save(SESSION_INTERFACE, 'DepartamentsList', $ArDepartamentos);
        $this->save(SESSION_INTERFACE, 'PositionsList', $ArFuncoes);

        $this->view('editar', self::PACKAGE_VIEW);
    }

    public function cadastrarFuncionario() {
        $ArDepartamentos = $this->departamentoService->findAll(true);
        $ArFuncoes = $this->funcaoService->findAll(true);
        $ArFerramentas = $this->ferramentaService->findAll();
        $ArPreferences = $this->preferenciaService->findAll();

        $this->save(SESSION_INTERFACE, 'DepartamentsList', $ArDepartamentos);
        $this->save(SESSION_INTERFACE, 'PositionsList', $ArFuncoes);
        $this->save(SESSION_INTERFACE, 'ToolsList', $ArFerramentas);
        $this->save(SESSION_INTERFACE, 'PreferencesList', $ArPreferences);

        $this->view('cadastrar_funcionario', self::PACKAGE_VIEW);
    }

    public function atualizarFuncionario() {
        $ArDados = $_POST;
        $Form = Validator::salvarFuncionario($ArDados);
        if( !$Form->validate() ) {
            $this->saveReturn( $Form->getFirstError() );
        }

        if( !$this->hasReturn() && !empty($ArDados['Dependente']) ) {
            $FormDependente = Validator::salvarFuncionarioDependente($ArDados['Dependente']);
            if( !$FormDependente->validate() ) {
                $this->saveReturn( $Form->getFirstError() );
            }
        }

        $ArDados['Pessoal']['EnStatus'] = $ArDados['Administrativo']['EnStatus'] == 'CONTRATADO' ? 'ATIVADO' : 'DESATIVADO';
        $ArDados['Pessoal']['DtNascimento'] = dateBRtoBD($ArDados['Pessoal']['DtNascimento']);
        $ArDados['Administrativo']['DtAdmissao'] = dateBRtoBD($ArDados['Administrativo']['DtAdmissao']);
        $ArDados['Administrativo']['DtDemissao'] = dateBRtoBD($ArDados['Administrativo']['DtDemissao']);

        $ArDados['Dependente'] =  !empty($ArDados['Dependente']) ? $ArDados['Dependente'] : array();
        foreach ($ArDados['Dependente'] as &$ArDadosDependente) {
            $ArDadosDependente['DtNascimentoDependente'] = dateBRtoBD($ArDadosDependente['DtNascimentoDependente']);
        }

        if (!$this->hasReturn()) {
            multipleEntities($ArDados);

            if ($this->administracaoService->updateEmployee($ArDados)) {
                $this->saveReturn('Usu&aacute;rio alterado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao alterar dados do usu&aacute;rio.');
            }
        }

        $this->showJsonResponse();
    }

    public function inserirFuncionario() {
        $ArDados = $_POST;
        $Form = Validator::salvarFuncionario($ArDados);
        if( !$Form->validate() ) {
            $this->saveReturn( $Form->getFirstError() );
        }

        if( !$this->hasReturn() && !empty($ArDados['Dependente']) ) {
            $FormDependente = Validator::salvarFuncionarioDependente($ArDados['Dependente']);
            if( !$FormDependente->validate() ) {
                $this->saveReturn( $Form->getFirstError() );
            }
        }

        $ArDados['Pessoal']['DtNascimento'] = dateBRtoBD($ArDados['Pessoal']['DtNascimento']);
        $ArDados['Administrativo']['DtAdmissao'] = dateBRtoBD($ArDados['Administrativo']['DtAdmissao']);

        if (!empty($ArDados['Dependente'])) {
            foreach ($ArDados['Dependente'] as &$ArDadosDependente) {
                $ArDadosDependente['DtNascimentoDependente'] = dateBRtoBD($ArDadosDependente['DtNascimentoDependente']);
            }
        }

        if( !$this->hasReturn() ) {
            if(  $this->usuarioService->hasCpfRegistered( $ArDados['Pessoal']['StCpf'] ) ) {
                $this->saveReturn('Erro: Este Cpf já consta em nossa base!');
            } else if( $this->usuarioService->hasRgRegistered( $ArDados['Pessoal']['StRg'] ) ) {
                $this->saveReturn('Erro: Este Rg já consta em nossa base!');
            } else if( $this->administracaoService->hasElectorTitleRegistered( $ArDados['Administrativo']['StTituloEleitor'] ) ) {
                $this->saveReturn('Erro: Este Título de Eleitor já consta em nossa base!');
            } else if( $this->administracaoService->hasPisRegistered( $ArDados['Administrativo']['StPis'] ) ) {
                $this->saveReturn('Erro: Este Pis já consta em nossa base!');
            } else if( $this->administracaoService->hasReservistCertifiedRegistered( $ArDados['Administrativo']['StCertificadoReservista'] ) ) {
                $this->saveReturn('Erro: Este Certificado de Reservista já consta em nossa base!');
            }
        }

        if (!$this->hasReturn()) {
            multipleEntities($ArDados);
            if ($this->administracaoService->saveEmployee($ArDados)) {
                $this->saveReturn('Usu&aacute;rio criado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao criar usu&aacute;rio. Certifique-se que o CPF ou Email são únicos no sistema.');
            }
        }

        $this->showJsonResponse();
    }

    public function folhaSalarial() {
        $this->save(SESSION_INTERFACE, 'GeneralSalarialSheetReport', $this->administracaoService->getGeneralSalarialSheet());
        $this->save(SESSION_INTERFACE, 'PositionSalarialSheetReport', $this->administracaoService->getPositionSalarialSheet());
        $this->save(SESSION_INTERFACE, 'DepartamentSalarialSheetReport', $this->administracaoService->getDepartamentSalarialSheet());
        $this->save(SESSION_INTERFACE, 'SectorSalarialSheetReport', $this->administracaoService->getSectorSalarialSheet());

        $this->view('folha_salarial', self::PACKAGE_VIEW);
    }

    public function ultimosFuncionariosRegistrados() {
        $this->save(SESSION_INTERFACE, 'LastRegisteredEmployeesReport', $this->administracaoService->getLastRegisteredEmployees());
        $this->save(SESSION_INTERFACE, 'LastFiredEmployeesReport', $this->administracaoService->getLastFiredEmployees());
        $this->view('funcionarios_registrados', self::PACKAGE_VIEW);
    }

    public function controlePagamento() {
        $this->save(SESSION_INTERFACE, 'ArUserList', $this->usuarioService->findUsersWithPendingPayment());
        $this->view('controle_pagamento_usuarios', self::PACKAGE_VIEW);
    }

    public function lancarPagamentoFuncionario() {
        $IDUsuario = treatUrl('id');
        multipleEntities($IDUsuario);
        $User = $this->usuarioService->findById($IDUsuario);
        $this->save(SESSION_INTERFACE, 'User', $User);
        $this->save(SESSION_INTERFACE, 'PeriodList', $this->pagamentoService->findPendingPeriodByUser($User));
        $this->view('lancar_pagamento_funcionario', self::PACKAGE_VIEW);
    }

    public function executarPagamento() {
        $ArDados = $_POST;

        $Form = Validator::executarPagamento($ArDados['Payments']);
        if( !$Form->validate() ) {
            $this->saveReturn( $Form->getFirstError() );
        }

        if( empty($ArDados['IDUsuario']) ) {
            $this->saveReturn('O Campo "IDUsuario" não foi recebido!');
        }

        foreach($ArDados['Payments'] as &$ArPayment) {
            $ArPayment['DtDiaPagamento'] = dateBRtoBD($ArPayment['DtDiaPagamento']);
        }

        if( !$this->hasReturn() ) {
            multipleEntities($ArDados);
            if( $this->pagamentoService->release($ArDados['IDUsuario'], $ArDados['Payments']) ) {
                $this->saveReturn('Pagamento(s) realizado(s) com sucesso!', 1);
            } else {
                $this->saveReturn('Ocorreu um erro na confirmação do pagamento. Nenhum pagamento foi confirmado!');
            }
        }

        $this->showJsonResponse();
    }

}